parser grammar CParser;

options {
  language = Java;
  tokenVocab = Clexer;
}

@header {
package PL.prac6;
}

@rulecatch {catch (RecognitionException e) {
  throw e;}
 }

entrada: cabecera EOF;

cabecera: (VOID|TIPO)(IDENT|MAIN) APARENTESIS (VOID | (llamada_variable (COMA llamada_variable)*)) CPARENTESIS ALLAVE cuerpo* CLLAVE;
llamada_variable: TIPO (ASTERISCO)? IDENT (ACORCHETE CCORCHETE)?;
operacion: (IDENT|NUMERO) ((MAS|MENOS|ASTERISCO|BARRA) (IDENT|NUMERO));
comparacion:APARENTESIS reglas ((AND | OR) reglas)* CPARENTESIS;
reglas:(((IDENT| NUMERO|operacion) COMPARADORES (IDENT| NUMERO|operacion)) | NOT? IDENT |cond_aritmetico);
cond_aritmetico: IDENT COMPARADORES NUMERO INTERROGANTE NUMERO DOSPUNTOS NUMERO;
bucle: WHILE comparacion;
condicion: IF comparacion;
sentencia: (bucle|condicion) (ALLAVE cuerpo+ CLLAVE |cuerpo);
cuerpo: (sentencia | asignacion| definicion|llamada_funcion|BREAK SEPARADOR);
asignacion: IDENT IGUAL (IDENT|NUMERO|CADENA|CARACTER) ((MAS|MENOS|ASTERISCO|BARRA) (IDENT|NUMERO|CADENA|CARACTER))* SEPARADOR;
definicion: TIPO IDENT (COMA IDENT) SEPARADOR;
llamada_funcion: IDENT APARENTESIS ((IDENT(ACORCHETE (NUMERO) CCORCHETE)? | NUMERO| CADENA|CARACTER) (COMA (IDENT(ACORCHETE (NUMERO) CCORCHETE)? | NUMERO| CADENA|CARACTER))*)? CPARENTESIS SEPARADOR;